/**
 * Beschreiben Sie hier die Klasse Buchungsverwaltung.
 * 
 * @author christoph.stueber@mes-alsfeld.de
 * @version Schuljahr 2013/2014 erstellt 15.03.2014 geändert 20.03.2014
 */
public class Buchungsverwaltung
{

    /** */
    private Liste<Kunde> kunden = new Liste<Kunde>();

    /** */
    private Liste<Auftrag> auftraege = new Liste<Auftrag>();

    /** */
    private Liste<Baumaschine> baumaschinen = new Liste<Baumaschine>();

    /** */
    private Liste<MaschinenTyp> typen = new Liste<MaschinenTyp>();

    /**
     * Konstruktor für Objekte der Klasse Buchungsverwaltung.
     */
    public Buchungsverwaltung()
    {

    }

    /**
     * Erstellt zum Kunden mit dem Namen kundenname einen neuen Auftrag.
     * 
     * @param kundenname
     * @return Auftrag
     */
    public Auftrag erstelleAuftrag(String kundenname)
    {
	return null;
    }

    /**
     * Erstellt eine neue Buchung zur angegebenen Baumaschine.
     * 
     * @param a Auftrag
     * @param b Baumaschine
     * @param von Datum
     * @param bis Datum
     * @return Buchung
     */
    public Buchung bucheBaumaschine(Auftrag a, Baumaschine b, Datum von,
	    Datum bis)
    {
	return b.buche(a, von, bis);
    }

    /**
     * Sucht den Auftrag zur passenden Auftragsnummer.
     * 
     * @param auftragsNummer int
     * @return Auftrag
     */
    public Auftrag sucheAuftrag(int auftragsNummer)
    {
	Auftrag result = null;
	for (Auftrag a : this.auftraege)
	{
	    if (a.getAuftragsNummer() == auftragsNummer)
	    {
		result = a;
	    }
	}
	return result;
    }

    /**
     * Sucht den Kunden zum passenden Namen.
     * 
     * @param name
     * @return Kunde
     */
    public Kunde sucheKunde(String name)
    {
	Kunde result = null;
	for (Kunde k : this.kunden)
	{
	    if (k.getName().equalsIgnoreCase(name))
	    {
		result = k;
	    }
	}
	return result;
    }

    /**
     * Legt einen neuen Kunden mit dem gegebenen Namen an.
     * 
     * @param name
     * @return Kunde
     */
    public Kunde anlegenKunde(String name)
    {
	return null;
    }

    /**
     * @return the baumaschinen
     */
    public Liste<Baumaschine> getBaumaschinen()
    {
	return baumaschinen;
    }

    /**
     * @param baumaschinen the baumaschinen to set
     */
    public void setBaumaschinen(Liste<Baumaschine> baumaschinen)
    {
	this.baumaschinen = baumaschinen;
    }

    /**
     * Sucht einen passenden Maschinentyp
     * 
     * @param bezeichnung
     * @return
     */
    public MaschinenTyp sucheMaschinenTyp(String bezeichnung)
    {
	MaschinenTyp result = null;
	for (MaschinenTyp m : typen)
	{
	    if (m.getBezeichnung().equalsIgnoreCase(bezeichnung))
	    {
		result = m;
		break;
	    }
	}
	return result;
    }

    /**
     * Sucht eine Baumaschine passenden Typs für den Zeitraum von/bis
     * 
     * @param typ String
     * @param von Datum
     * @param bis Datum
     * @return Baumaschine
     */
    public Baumaschine sucheBaumaschine(String bezeichnung, Datum von, Datum bis)
    {
	Baumaschine result = null;
	MaschinenTyp mt = sucheMaschinenTyp(bezeichnung);
	for (Baumaschine b : mt.getBaumaschinen())
	{
	    if (b.istFrei(von, bis))
	    {
		result = b;
		break;
	    }
	}
	return result;
    }

}
